package proxy;

import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.lang.reflect.Proxy;

/**
 * Created by zhj on 15-11-11.
 */
public class MainClient {
    public static void main(String[] args) {
        RealSubject real = new RealSubject();

        //1  动态生成的class都继承子Proxy   由于单继承特性，所以只能实现接口的动态代理  这里是subject
        // 2 根据指定的classLoader和代理接口s生成代理Class，然后反射调用Proxy(InvocationHandler h)创建代理实例
        // 3 生成代理class时会调用ProxyGenerator#generateProxyClass(final String name, Class[] interfaces)
        Subject proxySubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),
                new Class[]{Subject.class},
                new ProxyHandler(real));

        proxySubject.doSomething();

        //生成代理类的lass文件
        createProxyClassFile();
    }


    /**
     * 反编译源码见文本文件
     * 从中可以知道 一个代理类至少会重写toString,hashCode,equals方法，当然除此之外肯定包括代理接口方法
     */
    public static void createProxyClassFile()
    {
        String name = "ProxySubject";
        //具体二进制class动态生成的过程是在ProxyGenerator#generateClassFile实例方法中
        //基本生成思路就是
        // 1
        byte[] data = ProxyGenerator.generateProxyClass(name, new Class[]{Subject.class});

        try
        {
            FileOutputStream out = new FileOutputStream( name + ".class" );
            out.write(data);
            out.close();
        }
        catch( Exception e )
        {
            e.printStackTrace();
        }
    }
}
